package com.zuipin.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.esms.common.entity.Account;
import com.zuipin.entity.Member;
import com.zuipin.entity.MemberAccount;
import com.zuipin.entity.ThirdAccount;
import com.zuipin.framework.emuns.ErrorCode;
import com.zuipin.framework.exception.CustomException;
import com.zuipin.framework.result.Result;
import com.zuipin.mapper.ThirdAccountMapper;
import com.zuipin.service.IMemberAccountService;
import com.zuipin.service.IMemberService;
import com.zuipin.service.IThirdAccountService;
import com.zuipin.util.ConstantsUtil;
import com.zuipin.util.DateUtils;
import com.zuipin.util.SmsSendUtil;
import com.zuipin.util.StringUtil;
import com.zuipin.vo.MemberInfoVo;

/**
 * 
 * @ClassName: ThirdAccountServiceImpl 
 * @author wuyicheng
 * @time 2017年4月20日下午4:56:36
 */
@Service
public class ThirdAccountServiceImpl implements IThirdAccountService {
	
	@Resource
	private ThirdAccountMapper		thirdAccountMapper;
	@Resource
	private IMemberAccountService	memberAccountService;
	@Resource
	private IMemberService			memberService;
	@Value("${sms.account}")
	private String					smsAccount;
	@Value("${sms.password}")
	private String					smsPassword;
	@Value("${sms.sendFlag}")
	private String					sendFlag;
	
	@Override
	public Map<String, Object> findByMap(Map<String, Object> map) {
		return thirdAccountMapper.findByMap(map);
	}
	
	/**
	 * 新增第三方账号
	 *
	 * @Title: insert 
	 * @author: wuyicheng
	 * @date: 2017年5月2日下午7:56:43 
	 * @param thirdAccount
	 * @throws
	 */
	@Override
	public void insert(ThirdAccount thirdAccount) {
		thirdAccount.setCreateTime(DateUtils.getCurrentDateTime());
		thirdAccount.setUpdateTime(DateUtils.getCurrentDateTime());
		thirdAccount.setDelFlag(ConstantsUtil.DEL_FLAG_NO_0);
		//目前处理方案第三方账号登录的时候，创建会员信息
		memberAccountService.createMember(thirdAccount);
		thirdAccountMapper.insert(thirdAccount);
	}
	
	/**
	 * 修改第三方账号
	 *
	 * @Title: update 
	 * @author: wuyicheng
	 * @date: 2017年5月2日下午7:57:03 
	 * @param thirdAccount
	 * @throws
	 */
	@Override
	public void update(ThirdAccount thirdAccount) {
		thirdAccount.setUpdateTime(DateUtils.getCurrentDateTime());
		thirdAccountMapper.update(thirdAccount);
	}
	
	/** 
	 * 查找第三方账号
	 * 
	 * @Title: findByThirdAccount 
	 * @author: wuyicheng
	 * @date: 2017年4月24日上午3:00:30 
	 * @param thirdAccount
	 * @return
	 * @throws 
	 */
	@Override
	public ThirdAccount findByThirdAccount(ThirdAccount thirdAccount) {
		return thirdAccountMapper.findByThirdAccount(thirdAccount);
	}
	
	/** 
	 *	根据openID，系统ID，平台基础数据ID查询第三方账号
	 *
	 * @Title: findByOpenId 
	 * @author: wuyicheng
	 * @date: 2017年5月2日下午7:56:32 
	 * @param unionid 第三方平台唯一码
	 * @param openId 第三方平台唯一码
	 * @param platformId 平台基础数据ID
	 * @param sysId 系统ID
	 * @return
	 * @throws 
	 */
	@Override
	public ThirdAccount findByOpenId(String openId, String unionId, Long platformId, Long sysId) {
		ThirdAccount thirdAccount = new ThirdAccount();
		
		if (StringUtil.isNotBlank(unionId)) {
			thirdAccount.setUnionId(unionId);
		} else {
			thirdAccount.setOpenId(openId);
		}
		thirdAccount.setPlatformId(platformId);
		thirdAccount.setSysId(sysId);
		return findByThirdAccount(thirdAccount);
	}
	
	/** 
	 * 根据会员ID，系统ID，平台基础数据ID查询第三方账号
	 * 
	 * @Title: findByMemberId 
	 * @author: wuyicheng
	 * @date: 2017年5月2日下午7:56:32 
	 * @param memberId 会员ID
	 * @param platformId 平台基础数据ID
	 * @param sysId 系统ID
	 * @return
	 * @throws 
	 */
	@Override
	public ThirdAccount findByMemberId(Long memberId, Long platformId, Long sysId) {
		ThirdAccount thirdAccount = new ThirdAccount();
		thirdAccount.setMemberId(memberId);
		thirdAccount.setPlatformId(platformId);
		thirdAccount.setSysId(sysId);
		return findByThirdAccount(thirdAccount);
	}
	
	@Override
	public List<ThirdAccount> findList(List<Long> memberIds, Long platformId, Long sysId) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("memberIds", memberIds);
		map.put("platformId", platformId);
		map.put("sysId", sysId);
		return thirdAccountMapper.findListByMap(map);
	}
	
	/** 
	 *
	 * @Title: findList 
	 * @author: wuyicheng
	 * @date: 2017年6月23日上午12:05:56 
	 * @param memberId
	 * @param sysId
	 * @return
	 * @throws 
	 */
	@Override
	public List<ThirdAccount> findListByMemberIdAndSysId(Long memberId, Long sysId) {
		return thirdAccountMapper.findListByMemberIdAndSysId(memberId, sysId);
	}
	
	/**
	 * 判断修改手机号码
	 *
	 * @Title: toUpdatePhone 
	 * @author: wuyicheng
	 * @date: 2017年6月23日上午12:30:45 
	 * @param memberId 当前登录会员
	 * @param sysId 当前会员系统
	 * @param phone 绑定手机号
	 * @param isThirderAccount 是否是第三方账号 true是|false否
	 * @param platformId 平台类型ID
	 * @param isUpdate 是否保存修改
	 * @return
	 * @throws CustomException
	 * @throws
	 */
	@Transactional(rollbackFor = Exception.class)
	@Override
	public Result<MemberInfoVo> toUpdatePhone(Long memberId, Long sysId, String phone,
			boolean isThirderAccount, Long platformId, boolean isUpdate) throws CustomException {
		//（1）	支付宝A→手机号X
		// 微信B→手机号Y
		// 此时支付宝A不能修改绑定手机为Y，微信B也不能修改绑定手机为X，只有当某个手机号解绑了，才能被另一个第三方绑定
		//（2）	支付宝A→手机号X
		// 微信B→手机号X
		// 此时不同的第三方可以绑定同一个手机号X
		//（3）	支付宝A→手机号X
		// 微信B→手机号X
		// 此时，如果微信C要绑定手机号X，也是可以的，点击【获取验证码】时弹框提示“手机号码已经绑定相同第三方，确认修改”
		//（4）对于旧数据的处理，
		// 支付宝A→未绑定手机，会员ID 1
		// 微信B→未绑定手机，会员ID 2
		// 手机号X注册成会员，会员ID3
		// 此时使用微信B登录时，可以绑定手机号X，读取的是ID 3 的信息，下一次再使用微信B登录也是这样，ID2数据暂不处理（客户有投诉就线下处理吧）
		// （5）旧数据的处理——邮箱账号
		// 邮箱A→未绑定手机，会员ID 1
		// 手机号X注册成会员，会员ID 2
		// 此时使用邮箱A登录时，可以绑定手机号X，读取的是ID2的信息，下一次使用邮箱A登录也是读取ID2的信息，ID1数据暂不处理
		
		Result<MemberInfoVo> result = new Result<>(ErrorCode.SUCCESS);
		// 手机绑定的用户
		Member phoneUser = memberService.findByLoginName(phone);
		// 当前用户
		Member user = memberService.findById(memberId);
		// 当前用户第三方用户
		ThirdAccount userThirdAccount = null;
		if (phoneUser != null) {
			if (isThirderAccount) {
				if (platformId == null) {
					throw new CustomException(ErrorCode.ILLEGAL_PARAM);
				}
				// 如果是第三方账号修改手机
				userThirdAccount = findByMemberId(memberId, platformId, sysId);
				if (userThirdAccount == null) {
					throw new CustomException(ErrorCode.THIRD_ACCOUNT_NOT_EXIST);
				}
				if (user == null) {
					throw new CustomException(ErrorCode.MEMBER_NOT_EXIST);
				}
				if (phone.equals(user.getPhone())) {
					throw new CustomException(ErrorCode.PHONE_IS_BINDING);
				}
				
				if (StringUtil.isNotBlank(user.getPhone())) {
					// 手机是否绑定第三方帐号
					List<ThirdAccount> phoneList = this
							.findListByMemberIdAndSysId(phoneUser.getId(), sysId);
					if (phoneList != null && phoneList.size() > 0) {
						throw new CustomException(ErrorCode.MOBILE_PHONE_NOT_UPDATE);
					} else {
						// 直接修改
						// 当前第三方帐号更新用户ID
						if (isUpdate) {
							userThirdAccount.setMemberId(phoneUser.getId());
							this.update(userThirdAccount);
							user = phoneUser;
						}
					}
				} else {
					// 如果存在同平台帐号，要点确认
					// 手机号对应的第三方帐号
					ThirdAccount phoneThirdAccount = this.findByMemberId(phoneUser.getId(),
							platformId, sysId);
					if (phoneThirdAccount != null) {
						// 手机对应的用户同一平台下已存在帐号
						// 删除原来第三方绑定
						if (isUpdate) {
							phoneThirdAccount.setDelFlag(ConstantsUtil.DEL_FLAG_YES_1);
							this.update(phoneThirdAccount);
							SmsSendUtil.doSendSms(phone,
									"尊敬的用户，您醉品商城账号" + phone
											+ "绑定的微信/支付宝/QQ（第三方名称）已变更，如有疑问请联系客服4006-066-068。",
									new Account(smsAccount, smsPassword), sendFlag);// 发短信
						} else {
							throw new CustomException(ErrorCode.MOBILE_PHONE_EXIST_SAME_THIRD);
						}
					}
					if (isUpdate) {
						// 当前第三方帐号更新用户ID
						userThirdAccount.setMemberId(phoneUser.getId());
						this.update(userThirdAccount);
						user = phoneUser;
					}
				}
				
			} else {
				
				// 5判断是邮箱帐号，且手机号空				
				if (StringUtil.isBlank(user.getPhone()) && StringUtil.isNotBlank(user.getEmail())) {
					if (isUpdate) {
						phoneUser.setEmail(user.getEmail());
						memberService.update(phoneUser);
						user.setEmail(null);
						memberService.updateByPrimaryKey(user);
						user = phoneUser;
					}
				} else {
					// 非第三方				
					result.setErrorCode(ErrorCode.PHONE_IS_BINDING);
				}
				
			}
			// 临时方案
			//result.setErrorCode(ErrorCode.PHONE_IS_BINDING);
		} else {
			if (user == null) {
				throw new CustomException(ErrorCode.MEMBER_NOT_EXIST);
			}
			if (isUpdate) {
				//String content = "会员修改绑定手机：从" + member.getPhone() + "修改成" + phone;
				//memberRecordService.addMemberRecordLog(memberId, sysId, MemberRecordType.OTHERS,content);
				user.setPhone(phone);
				user.setMemberAccount(phone);
				memberService.update(user);
			}
			
		}
		// 如果手机号不绑定任何帐号，直接修改手机
		MemberAccount userAccount = memberAccountService.findByMemberIdAndSysId(user.getId(),
				sysId);
		if (userAccount == null) {
			throw new CustomException(ErrorCode.MEMBER_ACCOUNT_NOT_EXIST);
		}
		if (isUpdate && ErrorCode.SUCCESS.equals(result.getErrorCode())) {
			MemberInfoVo memberInfoVo = new MemberInfoVo();
			memberInfoVo.setMember(user);
			memberInfoVo.setMemberAccount(userAccount);
			memberInfoVo.setThirdAccount(userThirdAccount);
			result.setData(memberInfoVo);
		}
		return result;
	}
	
}
